#include <iostream>
#include <cstring>
using namespace std;

typedef long long ll;

const int N = 1000010;

int prime[N], cnt = 0; //存储质数
int phi[N];            //每个数对应的欧拉函数
bool st[N];            //记录是否被筛掉了
int n;                 //获取输入
ll sum = 0;            //存储答案

void get_phi(int n)
{
    memset(st, false, sizeof st); //现阶段所有的点都还没被筛掉
    phi[1] = 1;                   //因为1不是质数也不是合数，无法在线性筛中被处理，所以先进行预定义
    for (int i = 2; i <= n; ++i)  //遍历2到n的所有数
    {
        if (!st[i]) //如果这个点现在为止都还没有被筛选掉
        {
            prime[cnt++] = i; //那么这个数是一个质数、
            phi[i] = i - 1;   //是质数以后可以直接套特例即可
        }
        for (int j = 0; prime[j] <= n / i; ++j) //在prime[j]*i<=n的前提，既不爆数组的前题下遍历所有本次循环
        {
            int t = prime[j] * i;
            st[t] = true;          //由线性筛的原理，这个一定是被最小质因数筛去的
            if (i % prime[j] == 0) //如果本次遍历的数是i的质因数，那么也一定是最小质因数，这样的话后面的prime[j]*i不能保证是被最小质因数，所以对这个的处理后必须退出
            //而且如果prime[j]是i的质因数，那么差别就不一样
            {
                phi[t] = prime[j] * phi[i];
                break;
            }
            phi[t] = phi[i] * (prime[j] - 1); //能到这里就代表prime不是i的质因数
        }
    }
    return;
}

int main()
{
    cin >> n;
    get_phi(n);
    for (int i = 1; i <= n; ++i)
        sum += phi[i];
    cout << sum;
    return 0;
}